Profile picture

[k8s] containerd 환경에서 이미지 레지스트리에 배포된 프라이빗 이미지 사용하는 방법

JaehyoJJAng2023년 05월 10일

개요

최근 쿠버네티스 클러스터를 구축하면서 CRI(Container Runtime Interface)가 Docker 대신 containerd 기반으로 설정된 경우가 많아졌어요.

이러한 환경에서 Docker hub의 프라이빗 이미지를 사용하려면 어떻게 해야 할까요?


Docker 데몬이 설치되어 있지 않아 일반적인 docker login 명령어를 사용할 수 없는 상황에서,

쿠버네티스에서 제공하는 imagePullSecrets라는 기능을 사용하여 이 문제를 해결할 수 있어요!


containerd 환경에서 Docker hub 인증이 필요할까?

일반적으로 Docker hub에 배포된 프라이빗 이미지를 사용하려면 인증이 필요해요.

기존 도커 환경에서는 docker login 명령어를 통해 인증 정보를 저장하지만,

쿠버네티스 클러스터가 containerd를 사용하면 별도의 도커 데몬이 없으므로 이 방식은 적용되지 않아요.


쿠버네티스의 imagePullSecrets 활용

쿠버네티스는 imagePullSecrets라는 기능을 통해 클러스터 내에서 프라이빗 레지스트리 접근 시 필요한 인증 정보를 제공할 수 있어요!

해당 기능은 인증 벙보를 쿠버네티스 Secret 객체로 저장하고,

Pod나 Deployment에서 이를 참조해 도커 허브나 다른 레지스트리의 이미지를 안전하게 가져올 수 있어요.


단계별 설정 방법

이제 실제로 imagePullSecret를 설정하는 방법을 단계별로 알아볼게요!

저는 도커 허브를 기준으로 진행해봤어요!


(1) 도커 허브 인증 정보 준비

먼저, 도커 허브 또는 다른 레지스트리 서버에서 인증에 사용할 개인 액세스 토큰 을 생성해야 해요.


액세스 토큰이 준비 되었다면 안전한 곳에 토큰을 복사해 저장해놓으세요!


(2) 쿠버네티스 secret 생성

도커 허브의 사용자 이름, 액세스 토큰, 이메일 정보를 사용해 쿠버네티스 Secret을 생성해줘요.

다음 명령어를 사용하면 돼요.

kubectl create secret docker-registry dockerhub-secret \
  --docker-server=https://index.docker.io/v1/ \
  --docker-username=<DOCKERHUB_USERNAME> \
  --docker-password=<DOCKERHUB_ACCESS_TOKEN> \
  --docker-email=<DOCKERHUB_EMAIL>
  • dockerhub-secret: 생성할 시크릿의 이름. 원하는 이름으로 변경 가능
  • DOCKERHUB_USERNAME: Docker Hub 사용자명
  • DOCKERHUB_ACCESS_TOKEN: Docker Hub 비밀번호
  • DOCKERHUB_EMAIL: 이메일 주소 (생략 가능)

이 명령어는 Docker hub에 접근할 수 있는 인증 정보를 쿠버네티스 Secret으로 저장해요.



시크릿이 제대로 생성되었는지 확인을 해야겠죠?

kubectl get secret my-dockerhub-secret --output=yaml


(3) Pod 또는 Deployment에서 Secret 참조

이제 Pod나 Deployment 설정에서 imagePullSecrets 필드를 추가해 방금 만든 Secret을 연결해줘요.

예를 들어, Deployment 명세서(yaml) 파일은 다음과 같이 작성할 수 있어요.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: <DOCKERHUB_USERNAME>/<REPOSITORY>:<TAG>
      imagePullSecrets:
      - name: dockerhub-secret
  • <DOCKERHUB_USERNAME>/<REPOSITORY>:<TAG>: Docker Hub에 있는 private 이미지 경로와 태그로 바꿔주세요.
  • imagePullSecretsdockerhub-secret을 지정하면 쿠버네티스가 이 Secret을 사용해 Docker Hub에서 이미지를 가져옵니다.

(4) 적용 및 확인

YAML 파일을 적용해야겠죠?

kubectl apply -f deployment.yaml

그리고 Pod가 정상적으로 생성되고 이미지가 pull 되었는지 확인해야해요!

kubectl get pods

Pod 상태가 Running이면 성공!


추가 팁

도커 허브 외에 프라이빗 레지스트리 (ECR, GCR, Github Container Registry, Gitlab Registry 등등) 를 사용할 경우

--docker-server 값을 해당 레지스트리 URL로 변경해주면 됩니다~

kubectl create secret docker-registry dockerhub-secret \
  --docker-server=<REGISTRY_URL> \
  ...
  ...
  ...

Loading script...